/*
 * @Description: 泛型约束
 * @Autor: HuiSir<273250950@qq.com>
 * @Date: 2021-05-20 14:18:51
 * @LastEditTime: 2021-05-20 14:33:09
 */

(function () {
    /**
     * 如果直接对一个泛型参数取length属性，由于不明确这个泛型会不会有这个属性，所以会报错。
     * 我们需要对这个泛型进行约束，规定其类型范围。
     */

    /* function getLength<T>(t: T): number {
        return t.length  // 报错：类型“T”上不存在属性“length”。
    } */


    /**
     * 定义一个接口，规定某个对象必须要有length属性
     */
    interface iLength {
        length: number
    }

    /**
     * 用接口来约束泛型参数
     * 在尖括号中使用`extends`关键字来继承接口的约束
     */
    function getLength<T extends iLength>(t: T): number {
        return t.length
    }

    console.log(getLength<string>("Hello World"))   // 11
    console.log(getLength<string[]>(["Hello", "World"]))   // 2
    // console.log(getLength(10))   // 报错：类型“number”的参数不能赋给类型“iLength”的参数。
})()
